From 477f96d90135708ef39c6295276275620e73ec53 Mon Sep 17 00:00:00 2001 From: Xiyue Deng Date: Mon, 16 Jun 2025 17:09:48 -0700 Subject: [PATCH] Add script to generate Emacs builtin packages information - Support output in human readable JSON format or as substvars --- debian/generate-emacs-builtin-package-info.el | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 debian/generate-emacs-builtin-package-info.el diff --git a/debian/generate-emacs-builtin-package-info.el b/debian/generate-emacs-builtin-package-info.el new file mode 100644 index 00000000000..8292df5dccf --- /dev/null +++ b/debian/generate-emacs-builtin-package-info.el @@ -0,0 +1,109 @@ +;; Emacs script to generate a package provide list -*- lexical-binding:t -*- +(require 'json) +(require 'package) + +(defvar package-skip-list + '("elpa-emacs") + "A list of package that should be skipped in the provide list") + +(defun package-version-list-to-string (package-version-list) + "Convert a package version list to version string acceptable in Debian." + (when package-version-list + (let ((count 0) + version-list) + (dolist (item package-version-list) + (progn + (if (< item 0) + (progn + ;; This roughly matches the mapping in + ;; version-regexp-alist. + (cl-case item + (-1 (push "~rc" version-list)) + (-2 (push "~beta" version-list)) + (-3 (push "~alpha" version-list)) + (-4 (push "~snapshot" version-list)) + (t (error "Unknown version: %d" item))) + ;; no "." between prerelease name and number + (setq count 0)) + (when (> count 0) + (push "." version-list)) + (push (number-to-string item) version-list) + (cl-incf count)))) + (string-join (nreverse version-list))))) + +(defun emacs-provided-package-versions () + "Return an alist of Debian package name to version mapping." + (let (emacs-provided-package-versions) + (mapc (lambda (package-name) + (let* ((debian-package-name (concat "elpa-" + (symbol-name package-name))) + (debian-package-version (package-version-list-to-string + (package-builtin-package-version + package-name)))) + (when (not (member debian-package-name package-skip-list)) + (push `(,debian-package-name . ,debian-package-version) + emacs-provided-package-versions)))) + (package-versioned-builtin-packages)) + (sort emacs-provided-package-versions))) + +(defun print-help () + "Print help info" + (message "Generate information for Emacs built-in packages. Please use the following options: + --json Generate a report in human readable JSON format + --substvars Generate substvars for Emacs build process + --script-help This help info +")) + +(defun generate-builtin-package-info-json () + "Generate Emacs built-in-package info report in JSON format." + (princ (format "%s\n" + (with-temp-buffer + (insert (json-encode (emacs-provided-package-versions))) + (json-pretty-print-buffer) + (buffer-string))))) + +(defun generate-builtin-package-info-substvars () + "Generate Emacs built-in package info as substvars for emacs-common." + (let (provides-substvars-list + replaces-substvars-list + (count 0)) + (mapc (lambda (package-version) + (let* ((name (car package-version)) + (version (cdr package-version)) + (provides-entry-string (concat name + (when version + (format " (= %s)" version)) + ",")) + (replaces-entry-string (concat name + (when version + (format " (<< %s)" version)) + ","))) + (when (> count 0) + (push " " provides-substvars-list) + (push " " replaces-substvars-list)) + (push provides-entry-string provides-substvars-list) + (push replaces-entry-string replaces-substvars-list) + (cl-incf count))) + (emacs-provided-package-versions)) + (let ((debian-provides-substvars-string + (string-join (nreverse provides-substvars-list))) + (debian-replaces-substvars-string + (string-join (nreverse replaces-substvars-list)))) + (princ (format "emacs:Provides=%s\n" debian-provides-substvars-string)) + (princ (format "emacs:Breaks=%s\n" debian-replaces-substvars-string)) + (princ (format "emacs:Replaces=%s\n" debian-replaces-substvars-string))))) + +(defun main () + "Main program entrance." + (if (not argv) + (print "Missing argument. Should specify \"--report\" or \"--substvars\"." + #'external-debugging-output) + (let ((option (elt argv 0))) + (pcase option + ("--json" (generate-builtin-package-info-json)) + ("--substvars" (generate-builtin-package-info-substvars)) + ("--script-help" (print-help)) + (_ (error "Unknown option \"%s\"." option))))) + (kill-emacs 0)) + +(main) -- 2.30.2